package com.springapi.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Myutil {
    public static void main(String[] args) {
        String input = "汉字开头的一个字符串示例";

        // 使用正则表达式匹配第一个汉字
        String firstChineseCharacter = getFirstChineseCharacter(input);

        if (firstChineseCharacter != null) {
            System.out.println("第一个汉字是: " + firstChineseCharacter);
        } else {
            System.out.println("字符串不以汉字开头");
        }
    }


    //入参字符串，返回第一个汉字（字符串需要汉字开头）
    public static String getFirstChineseCharacter(String input) {
        if (input == null || input.isEmpty()) {
            return null;
        }

        // 正则表达式匹配第一个汉字
        String regex = "[\\u4E00-\\u9FFF]";
        java.util.regex.Matcher matcher = java.util.regex.Pattern.compile(regex).matcher(input);

        if (matcher.find()) {
            return matcher.group();
        } else {
            return null;
        }
    }


    // 定义一个静态方法，用于提取手机号
    public static String extractPhoneNumber(String input) {
        // 定义匹配手机号的正则表达式（假设手机号为11位数字）
        String regex = "\\d{11}";

        // 创建Pattern对象
        Pattern pattern = Pattern.compile(regex);

        // 创建Matcher对象
        Matcher matcher = pattern.matcher(input);

        // 查找匹配项并返回第一个匹配结果
        if (matcher.find()) {
            return matcher.group();
        } else {
            return "未找到手机号";
        }
    }

    //extractPhoneNumber2更详细，当字符串是11位数字（手机号），或者汉字+11位数字（姓名+手机号）时，返回11位数字（手机号）
    public static String extractPhoneNumber2(String text) {
        // 正则表达式解释：
        // \b 表示单词边界，确保我们匹配的是完整的11位数字而不是数字的一部分
        // \d{11} 表示11位数字
        // (?:\p{IsHan}+)? 表示可选的汉字前缀，\p{IsHan} 匹配任意汉字，? 表示这个汉字前缀是可选的
        // (\d{11}) 是我们要捕获的手机号部分
        String regex = "(?:\\p{IsHan}+)?(\\b\\d{11}\\b)";

        // 使用正则表达式匹配输入字符串
        java.util.regex.Matcher matcher = java.util.regex.Pattern.compile(regex).matcher(text);

        // 如果找到了匹配项，就返回捕获组（即手机号）
        if (matcher.find()) {
            return matcher.group(1);
        } else {
            // 如果没有找到匹配项，可以返回null或者抛出一个异常，这里返回null作为示例
            return null;
        }
    }
    //java 当字符串是11位数字（手机号），或者汉字+11位数字（姓名+手机号）时，返回非11位数字（手机号）部分
    public static String extractNonPhoneNumberPart(String text) {
        // 正则表达式解释：
        // \\d{11} 表示11位数字（手机号）
        // (.*?) 表示非贪婪匹配任意字符（尽可能少的匹配字符），直到遇到后面的模式
        // (\\d{11}) 是我们要排除的手机号部分，但由于我们只想获取前面的部分，所以这里不需要捕获它
        // 使用正则表达式时，我们将手机号部分放在后面，并用.*?来匹配前面的任意字符
        // 但是，由于我们想要的是前面的部分，并且不想匹配到手机号，所以我们需要稍微调整策略
        // 我们可以先匹配整个字符串，然后查找并移除手机号部分
        String regex = "\\d{11}"; // 这里只定义手机号的正则表达式，用于后续替换

        // 使用正则表达式替换输入字符串中的手机号部分为空字符串
        String result = text.replaceAll(regex, "");

        // 去除结果字符串两端的空白字符（如果有的话）
        result = result.trim();

        // 如果结果是空字符串，说明原字符串只有手机号，没有其他部分
        // 根据需求，你可以返回null、空字符串或者抛出一个异常
        if (result.isEmpty()) {
            return ""; // 这里返回空字符串作为示例
        }

        return result;
    }


    //检查字符串是否包含11为数字(checknumber代表几个数字)
    /*
    *"abc12345678901"; // 包含11位以上数字（作为子串）
    * "xyz7890abc1234"; // 不包含连续的11位数字
    * "12345678901abcdefg"; // 包含11位以上数字（从开头开始）
     */
    public static Boolean checkAndOutput(String texti,Integer checknumber) {

        // 正则表达式，用于匹配至少11个连续的数字
        String regex = "\\d{"+checknumber+",}";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(texti);

        // 使用 find 方法检查字符串中是否包含匹配正则表达式的子串
        if (matcher.find()) {
            return true;
        }else {
            return false;
        }

    }
    // 提取变量text中挨着的数字部分，如果字符串中有多个数字段，取第一个，texti可能是汉字+数组或者字母+数字或者特殊符号+数字
    public static String extractFirstNumber(String text) {
        // 定义正则表达式，用于匹配一个或多个连续的数字
        Pattern pattern = Pattern.compile("\\d+");
        // 创建 Matcher 对象，用于在输入字符串中查找匹配项
        Matcher matcher = pattern.matcher(text);

        // 查找第一个匹配的连续数字段
        if (matcher.find()) {
            // 如果找到匹配项，返回匹配的字符串
            return matcher.group();
        }
        // 如果没有找到匹配项，返回空字符串
        return "";
    }

    //当字符串有不确定个*号时，截取*号之后的4（checknumber）位
    public static String getstrbyxing(String input,Integer checknumber) {
        String result="";
        // 查找最后一个 * 号的位置
        int lastIndex = input.lastIndexOf('*');

        if (lastIndex == -1) {
            result="";
        } else {
            // 从最后一个 * 号的位置开始截取后四位
            int startIndex = Math.max(lastIndex + 1, 0); // 确保索引不会越界
            int endIndex = Math.min(startIndex + checknumber, input.length()); // 确保不会超出字符串长度
            result=input.substring(startIndex, endIndex);
        }
        return result;
    }





}
